home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / progress / progress.cpp.z / progress.cpp
C/C++ Source or Header  |  2002-04-08  |  8KB  |  336 lines

  1. /****************************************************************************
  2. ** $Id:  qt/progress.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. #include <qprogressdialog.h>
  12. #include <qapplication.h>
  13. #include <qmenubar.h>
  14. #include <qpopupmenu.h>
  15. #include <qpainter.h>
  16. #include <stdlib.h>
  17.  
  18. class AnimatedThingy : public QLabel {
  19. public:
  20.     AnimatedThingy( QWidget* parent, const QString& s ) :
  21.     QLabel(parent),
  22.     label(s),
  23.     step(0)
  24.     {
  25.     label+="\n... and wasting CPU\nwith this animation!\n";
  26.  
  27.     for (int i=0; i<nqix; i++)
  28.         ox[0][i] = oy[0][i] = ox[1][i] = oy[1][i] = 0;
  29.     x0 = y0 = x1 = y1 = 0;
  30.     dx0 = rand()%8+2;
  31.     dy0 = rand()%8+2;
  32.     dx1 = rand()%8+2;
  33.     dy1 = rand()%8+2;
  34.     }
  35.  
  36.     void show()
  37.     {
  38.     if (!isVisible()) startTimer(100);
  39.     QWidget::show();
  40.     }
  41.  
  42.     void hide()
  43.     {
  44.     QWidget::hide();
  45.     killTimers();
  46.     }
  47.  
  48.     QSize sizeHint() const
  49.     {
  50.     return QSize(120,100);
  51.     }
  52.  
  53. protected:
  54.     void timerEvent(QTimerEvent*)
  55.     {
  56.     QPainter p(this);
  57.     QPen pn=p.pen();
  58.     pn.setWidth(2);
  59.     pn.setColor(backgroundColor());
  60.     p.setPen(pn);
  61.  
  62.     step = (step + 1) % nqix;
  63.  
  64.     p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]);
  65.  
  66.     inc(x0, dx0, width());
  67.     inc(y0, dy0, height());
  68.     inc(x1, dx1, width());
  69.     inc(y1, dy1, height());
  70.     ox[0][step] = x0;
  71.     oy[0][step] = y0;
  72.     ox[1][step] = x1;
  73.     oy[1][step] = y1;
  74.  
  75.     QColor c;
  76.     c.setHsv( (step*255)/nqix, 255, 255 ); // rainbow effect
  77.     pn.setColor(c);
  78.     p.setPen(pn);
  79.     p.drawLine(ox[0][step], oy[0][step], ox[1][step], oy[1][step]);
  80.     p.setPen(colorGroup().text());
  81.     p.drawText(rect(), AlignCenter, label);
  82.     }
  83.  
  84.     void paintEvent(QPaintEvent* event)
  85.     {
  86.     QPainter p(this);
  87.     QPen pn=p.pen();
  88.     pn.setWidth(2);
  89.     p.setPen(pn);
  90.     p.setClipRect(event->rect());
  91.     for (int i=0; i<nqix; i++) {
  92.         QColor c;
  93.         c.setHsv( (i*255)/nqix, 255, 255 ); // rainbow effect
  94.         pn.setColor(c);
  95.         p.setPen(pn);
  96.         p.drawLine(ox[0][i], oy[0][i], ox[1][i], oy[1][i]);
  97.     }
  98.     p.setPen(colorGroup().text());
  99.     p.drawText(rect(), AlignCenter, label);
  100.     }
  101.  
  102. private:
  103.     void inc(int& x, int& dx, int b)
  104.     {
  105.     x+=dx;
  106.     if (x<0) { x=0; dx=rand()%8+2; }
  107.     else if (x>=b) { x=b-1; dx=-(rand()%8+2); }
  108.     }
  109.  
  110.     enum {nqix=10};
  111.     int ox[2][nqix];
  112.     int oy[2][nqix];
  113.     int x0,y0,x1,y1;
  114.     int dx0,dy0,dx1,dy1;
  115.     QString label;
  116.     int step;
  117. };
  118.  
  119.  
  120. class CPUWaster : public QWidget
  121. {
  122.     Q_OBJECT
  123.  
  124.     enum { first_draw_item = 1000, last_draw_item = 1006 };
  125.  
  126.     int drawItemRects(int id)
  127.     {
  128.     int n = id - first_draw_item;
  129.     int r = 100;
  130.     while (n--) r*=(n%3 ? 5 : 4);
  131.     return r;
  132.     }
  133.     QString drawItemText(int id)
  134.     {
  135.     QString str;
  136.     str.sprintf("%d Rectangles", drawItemRects(id));
  137.     return str;
  138.     }
  139.  
  140. public:
  141.     CPUWaster() :
  142.     pb(0)
  143.     {
  144.     menubar = new QMenuBar( this, "menu" );
  145.     Q_CHECK_PTR( menubar );
  146.  
  147.     QPopupMenu* file = new QPopupMenu();
  148.     Q_CHECK_PTR( file );
  149.     menubar->insertItem( "&File", file );
  150.     for (int i=first_draw_item; i<=last_draw_item; i++)
  151.         file->insertItem( drawItemText(i), i );
  152.     connect( menubar, SIGNAL(activated(int)), this, SLOT(doMenuItem(int)) );
  153.     file->insertSeparator();
  154.     file->insertItem( "Quit", qApp,  SLOT(quit()) );
  155.  
  156.     options = new QPopupMenu();
  157.     Q_CHECK_PTR( options );
  158.     menubar->insertItem( "&Options", options );
  159.     td_id = options->insertItem( "Timer driven", this, SLOT(timerDriven()) );
  160.     ld_id = options->insertItem( "Loop driven", this, SLOT(loopDriven()) );
  161.     options->insertSeparator();
  162.     dl_id = options->insertItem( "Default label", this, SLOT(defaultLabel()) );
  163.     cl_id = options->insertItem( "Custom label", this, SLOT(customLabel()) );
  164.     options->insertSeparator();
  165.     md_id = options->insertItem( "No minimum duration", this, SLOT(toggleMinimumDuration()) );
  166.     options->setCheckable( TRUE );
  167.     loopDriven();
  168.     defaultLabel();
  169.  
  170.     setFixedSize( 400, 300 );
  171.  
  172.     setBackgroundColor( black );
  173.     }
  174.  
  175. public slots:
  176.     void doMenuItem(int id)
  177.     {
  178.     if (id >= first_draw_item && id <= last_draw_item)
  179.         draw(drawItemRects(id));
  180.     }
  181.  
  182.     void stopDrawing() { got_stop = TRUE; }
  183.  
  184.     void timerDriven()
  185.     {
  186.     timer_driven = TRUE;
  187.     options->setItemChecked( td_id, TRUE );
  188.     options->setItemChecked( ld_id, FALSE );
  189.     }
  190.  
  191.     void loopDriven()
  192.     {
  193.     timer_driven = FALSE;
  194.     options->setItemChecked( ld_id, TRUE );
  195.     options->setItemChecked( td_id, FALSE );
  196.     }
  197.  
  198.     void defaultLabel()
  199.     {
  200.     default_label = TRUE;
  201.     options->setItemChecked( dl_id, TRUE );
  202.     options->setItemChecked( cl_id, FALSE );
  203.     }
  204.  
  205.     void customLabel()
  206.     {
  207.     default_label = FALSE;
  208.     options->setItemChecked( dl_id, FALSE );
  209.     options->setItemChecked( cl_id, TRUE );
  210.     }
  211.  
  212.     void toggleMinimumDuration()
  213.     {
  214.     options->setItemChecked( md_id, 
  215.        !options->isItemChecked( md_id ) );
  216.     }
  217.  
  218. private:
  219.     void timerEvent( QTimerEvent* )
  220.     {
  221.     pb->setProgress( pb->totalSteps() - rects );
  222.     rects--;
  223.  
  224.     {
  225.         QPainter p(this);
  226.  
  227.         int ww = width();
  228.         int wh = height();
  229.  
  230.         if ( ww > 8 && wh > 8 ) {
  231.         QColor c(rand()%255, rand()%255, rand()%255);
  232.         int x = rand() % (ww-8);
  233.         int y = rand() % (wh-8);
  234.         int w = rand() % (ww-x);
  235.         int h = rand() % (wh-y);
  236.         p.fillRect( x, y, w, h, c );
  237.         }
  238.     }
  239.  
  240.     if (!rects || got_stop) {
  241.         pb->setProgress( pb->totalSteps() );
  242.         QPainter p(this);
  243.         p.fillRect(0, 0, width(), height(), backgroundColor());
  244.         enableDrawingItems(TRUE);
  245.         killTimers();
  246.         delete pb;
  247.         pb = 0;
  248.     }
  249.     }
  250.  
  251.     QProgressDialog* newProgressDialog( const char* label, int steps, bool modal )
  252.     {
  253.     QProgressDialog *d = new QProgressDialog(label, "Cancel", steps, this,
  254.                          "progress", modal);
  255.         if ( options->isItemChecked( md_id ) )
  256.         d->setMinimumDuration(0);
  257.     if ( !default_label )
  258.         d->setLabel( new AnimatedThingy(d,label) );
  259.     return d;
  260.     }
  261.  
  262.     void enableDrawingItems(bool yes)
  263.     {
  264.     for (int i=first_draw_item; i<=last_draw_item; i++) {
  265.         menubar->setItemEnabled(i, yes);
  266.     }
  267.     }
  268.             
  269.     void draw(int n)
  270.     {
  271.     if ( timer_driven ) {
  272.         if ( pb ) {
  273.         qWarning("This cannot happen!");
  274.         return;
  275.         }
  276.         rects = n;
  277.         pb = newProgressDialog("Drawing rectangles.\n"
  278.                    "Using timer event.", n, FALSE);
  279.         pb->setCaption("Please Wait");
  280.         connect(pb, SIGNAL(cancelled()), this, SLOT(stopDrawing()));
  281.         enableDrawingItems(FALSE);
  282.         startTimer(0);
  283.         got_stop = FALSE;
  284.     } else {
  285.         QProgressDialog* lpb = newProgressDialog(
  286.             "Drawing rectangles.\nUsing loop.", n, TRUE);
  287.         lpb->setCaption("Please Wait");
  288.  
  289.         QPainter p(this);
  290.         for (int i=0; i<n; i++) {
  291.         lpb->setProgress(i);
  292.         if ( lpb->wasCancelled() )
  293.             break;
  294.  
  295.         QColor c(rand()%255, rand()%255, rand()%255);
  296.         int x = rand()%(width()-8);
  297.         int y = rand()%(height()-8);
  298.         int w = rand()%(width()-x);
  299.         int h = rand()%(height()-y);
  300.         p.fillRect(x,y,w,h,c);
  301.         }
  302.  
  303.         p.fillRect(0, 0, width(), height(), backgroundColor());
  304.  
  305.         delete lpb;
  306.     }
  307.     }
  308.  
  309.     QMenuBar* menubar;
  310.     QProgressDialog* pb;
  311.     QPopupMenu* options;
  312.     int td_id, ld_id;
  313.     int dl_id, cl_id;
  314.     int md_id;
  315.     int rects;
  316.     bool timer_driven;
  317.     bool default_label;
  318.     bool got_stop;
  319. };
  320.  
  321. int main( int argc, char **argv )
  322. {
  323.     QApplication a( argc, argv );
  324.  
  325.     int wincount = argc > 1 ? atoi(argv[1]) : 1;
  326.  
  327.     for ( int i=0; i<wincount; i++ ) {
  328.     CPUWaster* cpuw = new CPUWaster;
  329.     if ( i == 0 ) a.setMainWidget(cpuw);
  330.     cpuw->show();
  331.     }
  332.     return a.exec();
  333. }
  334.  
  335. #include "progress.moc"
  336.